#ifndef COMBINATORY_POLICY_IMP_H
#define COMBINATORY_POLICY_IMP_H

#include <mili/mili.h>
#include "aso-core/common_types.h"
#include "aso-core/combinatory_policy.h"
#include "libpluginaso/combinatory_policy_newton.h"

/*! Politicas de Combinatoria */

/*! Implementacion de politica de combinacion Empty */
/*! No genera combinaciones y retorna Success */
class EmptyCombinatory: public CombinatoryPolicy
{
public:
    //! Constructor
    EmptyCombinatory(const std::string& name)
        : CombinatoryPolicy(name)
    {}

    virtual bool combine(const Avs& elements, CombinationObserver* observer, CombinationStatus& status);
};

/*! Implementacion de politica de combinacion Newtoneana */
struct CombineAll: public CombinatoryNewton<Avs>
{
    //! Constructor
    CombineAll(size_t min, size_t max, const std::string& name): CombinatoryNewton<Avs>(min, max, name)
    {}
};

/*! Implementacion de politica listar como Combinatoria */

class ListCombinatory: public CombinatoryPolicy
{
public:
    //! Constructor
    ListCombinatory(const std::string& name)
        : CombinatoryPolicy(name)
    {}

    virtual bool combine(const Avs& elements, CombinationObserver* observer, CombinationStatus& status);
};

#endif
